home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / Form-features.st < prev    next >
Text File  |  1993-07-24  |  6KB  |  160 lines

  1. "    NAME        Form-shrinkBy
  2.     AUTHOR        Dr Who
  3.     FUNCTION feature extraction --- contrast improvement
  4.     ST-VERSIONS    
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY
  11.     This method performs a simple feature extraction algorithm. Each pixel in
  12.      a form (the receiver) has each of the surrounding pixels (plus itself) summed
  13.      to return a value between 0 and 9. If the resulting value is between
  14.      the bounds given (lowerBound and UpperBound), then
  15.      the pixel is set black (1), otherwise the pixel is set white (0). For performance
  16.      reasons, the arithmetic is done with BitBlt operations (as in the Game of Life
  17.      implementation)."
  18.  
  19. 'From Smalltalk-80, version 2, of April 1, 1983 on 4 January 1987 at 11:04:49 am'!
  20.  
  21.  
  22.  
  23. !Form methodsFor: 'features'!
  24.  
  25. edgesAt: aValue
  26.     "This method performs a simple feature extraction algorithm. Each pixel in
  27.      a form (the receiver) has each of the surrounding pixels (plus itself) summed
  28.      to return a value between 0 and 9. If this value is equal to aValue,
  29.      the pixel is set black (1), otherwise the pixel is set white (0). This version is
  30.      more efficient than the general method edgesFrom: <lowerBound> to: <upperbound>."
  31.  
  32.     "Form fromUser edgesAt: 3; display."
  33.  
  34.     | nbr1 nbr2 nbr4 nbr8 carry2 carry4 carry8 all delta |
  35.     nbr1 _ Form extent: self extent.
  36.     nbr2 _ Form extent: self extent.
  37.     nbr4 _ Form extent: self extent.
  38.     nbr8 _ Form extent: self extent.
  39.     carry2 _ Form extent: self extent.
  40.     carry4 _ Form extent: self extent.
  41.     carry8 _ Form extent: self extent.
  42.     all _ self boundingBox.
  43.     1 to: 9 do:
  44.         [:i |
  45.          "delta is the offset of the eight neighboring cells, plus self."
  46.         delta _  
  47.             ((#(-1 0 1 1 1 0 -1 -1 0) at: i) @ (#(-1 -1 -1 0 1 1 1 0 0) at: i)).
  48.         carry2 copy: all from: 0@0 in: nbr1 rule: 3.
  49.         carry2 copy: all from: delta in: self rule: 1.  "AND for carry into 2"
  50.         nbr1 copy: all from: delta in: self rule: 6.     "XOR for sum 1"
  51.  
  52.         carry4 copy: all from: 0@0 in: nbr2 rule: 3.
  53.         carry4 copy: all from: 0@0 in: carry2 rule: 1. "AND for carry into 4"
  54.         nbr2 copy: all from: 0@0 in: carry2 rule: 6.    "XOR for sum 2"
  55.  
  56.         carry8 copy: all from: 0@0 in: nbr4 rule: 3.
  57.         carry8 copy: all from: 0@0 in: carry4 rule: 1. "AND for carry into 8"
  58.         nbr4 copy: all from: 0@0 in: carry4 rule: 6.    "XOR for sum 4"
  59.  
  60.         nbr8 copy: all from: 0@0 in: carry8 rule: 6].   "XOR for sum 8 (ignore carry)"
  61.  
  62.     aValue even ifTrue: [nbr1 reverse].
  63.     self copy: all from: 0@0 in: nbr1 rule: 3.            "Overwrite receiver for lsb."
  64.  
  65.     (aValue // 2) even ifTrue: [nbr2 reverse].
  66.     self copy: all from: 0@0 in: nbr2 rule: 1.            "AND for subsequent bits."
  67.  
  68.     (aValue // 4) even ifTrue: [nbr4 reverse].
  69.     self copy: all from: 0@0 in: nbr4 rule: 1.    
  70.  
  71.     (aValue // 8) even ifTrue: [nbr8 reverse].
  72.     self copy: all from: 0@0 in: nbr8 rule: 1.!
  73.  
  74. edgesDownTo: aValue 
  75.     "Performs edge extraction with bounds aValue and 9."
  76.  
  77.     aValue = 9
  78.         ifTrue: [self edgesAt: 9]
  79.         ifFalse: [self edgesFrom: aValue to: 9]
  80.  
  81.     "Form fromUser edgesDownTo: 2; display."!
  82.  
  83. edgesFrom: lowerBound to: upperBound
  84.     "This method performs a simple feature extraction algorithm. Each pixel in
  85.      a form (the receiver) has each of the surrounding pixels (plus itself) summed
  86.      to return a value between 0 and 9. If the resulting value is between
  87.      the bounds given (lowerBound and UpperBound), then
  88.      the pixel is set black (1), otherwise the pixel is set white (0). For performance
  89.      reasons, the arithmetic is done with BitBlt operations (as in the Game of Life
  90.      implementation)."
  91.  
  92.     "Form fromUser edgesFrom: 2 to: 4; display."
  93.  
  94.     | nbr1 nbr2 nbr4 nbr8
  95.      carry2 carry4 carry8 all delta aValue tempForm |
  96.  
  97.     nbr1 _ Form extent: self extent.
  98.     nbr2 _ Form extent: self extent.
  99.     nbr4 _ Form extent: self extent.
  100.     nbr8 _ Form extent: self extent.
  101.     carry2 _ Form extent: self extent.
  102.     carry4 _ Form extent: self extent.
  103.     carry8 _ Form extent: self extent.
  104.     all _ self boundingBox.
  105.     1 to: 9 do:
  106.         [:i |
  107.          "delta is the offset of the eight neighboring cells, plus self."
  108.         delta _  
  109.             ((#(-1 0 1 1 1 0 -1 -1 0) at: i) @ (#(-1 -1 -1 0 1 1 1 0 0) at: i)).
  110.         carry2 copy: all from: 0@0 in: nbr1 rule: 3.
  111.         carry2 copy: all from: delta in: self rule: 1.  "AND for carry into 2"
  112.         nbr1 copy: all from: delta in: self rule: 6.     "XOR for sum 1"
  113.  
  114.         carry4 copy: all from: 0@0 in: nbr2 rule: 3.
  115.         carry4 copy: all from: 0@0 in: carry2 rule: 1. "AND for carry into 4"
  116.         nbr2 copy: all from: 0@0 in: carry2 rule: 6.    "XOR for sum 2"
  117.  
  118.         carry8 copy: all from: 0@0 in: nbr4 rule: 3.
  119.         carry8 copy: all from: 0@0 in: carry4 rule: 1. "AND for carry into 8"
  120.         nbr4 copy: all from: 0@0 in: carry4 rule: 6.    "XOR for sum 4"
  121.  
  122.         nbr8 copy: all from: 0@0 in: carry8 rule: 6].   "XOR for sum 8 (ignore carry)"
  123.  
  124.     carry2 _ nbr2 deepCopy reverse.        "Make reversed copies."
  125.     carry4 _ nbr4 deepCopy reverse.
  126.     carry8 _ nbr8 deepCopy reverse.
  127.  
  128.     self copy: all from: 0@0 in: self rule: 6.        "Clear receiver form."
  129.  
  130.     lowerBound to: upperBound do: [ :aValue |
  131.         tempForm _ Form extent: self extent.
  132.  
  133.         aValue even
  134.             ifTrue: [tempForm copy: all from: 0@0 in: nbr1 rule: 12.]
  135.             ifFalse: [tempForm copy: all from: 0@0 in: nbr1 rule: 3].
  136.                         "Overwrite receiver for lsb."
  137.         (aValue // 2) even
  138.             ifTrue: [tempForm copy: all from: 0@0 in: carry2 rule: 1]
  139.             ifFalse: [tempForm copy: all from: 0@0 in: nbr2 rule: 1].
  140.                         "AND for subsequent bits."
  141.         (aValue // 4) even
  142.             ifTrue: [tempForm copy: all from: 0@0 in: carry4 rule: 1]
  143.             ifFalse: [tempForm copy: all from: 0@0 in: nbr4 rule: 1].    
  144.  
  145.         (aValue // 8) even
  146.             ifTrue: [tempForm copy: all from: 0@0 in: carry8 rule: 1]
  147.             ifFalse: [tempForm copy: all from: 0@0 in: nbr8 rule: 1].
  148.  
  149.         self copy: all from: 0@0 in: tempForm rule: 7.    "Combine with OR."
  150.     ].!
  151.  
  152. edgesUpTo: aValue 
  153.     "Performs edge extraction with bounds 0 and aValue."
  154.  
  155.     aValue = 0
  156.         ifTrue: [self edgesAt: 0]
  157.         ifFalse: [self edgesFrom: 0 to: aValue]
  158.  
  159.     "Form fromUser edgesUpTo: 2; display."! !
  160.